﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;
using Neturion.Utils;

namespace Neturion.Negocios
{
    public class NegocioLancamento
    {
        private IRepositorioLancamento _repositorioLancamento;

        public NegocioLancamento()
        {
            _repositorioLancamento = new RepositorioLancamento();
        }

        public Lancamento Inserir(Lancamento lancamento)
        {
            return _repositorioLancamento.Inserir(lancamento);
        }

        public Lancamento Atualizar(Lancamento lancamento)
        {
            return _repositorioLancamento.Atualizar(lancamento);
        }

        public void Excluir(Lancamento lancamento)
        {
            Lancamento lancamentoTmp = ObterPorId(lancamento.LancamentoId);
            _repositorioLancamento.Excluir(lancamentoTmp);
        }

        public IList<Lancamento> ObterTodos()
        {
            return _repositorioLancamento.ObterTodos();
        }

        public Lancamento ObterPorId(int id)
        {
            return _repositorioLancamento.ObterPorId(id);
        }

        public void CriarLancamento(Transferencia transferencia)
        {
            Lancamento lancamentoDebito = new Lancamento();
            lancamentoDebito.DataEmissao = transferencia.DataOperacao;
            lancamentoDebito.EnumTipoLancamento = EnumTipoMovimentoFinanceiro.Pagar;
            lancamentoDebito.Descricao = "Transferência Nº " + transferencia.TransferenciaId
                                         + " Débito na Conta " + transferencia.ContaBancoOrigem.Descricao + ": " + Util.NumeroContaFormatado(transferencia.ContaBancoOrigem.NumeroConta)
                                         + " e Crédito na Conta " + transferencia.ContaBancoDestino.Descricao + ": " + Util.NumeroContaFormatado(transferencia.ContaBancoDestino.NumeroConta)
                                         + " " + transferencia.Historico;
            lancamentoDebito.Documento = transferencia.Documento;
            lancamentoDebito.Valor = transferencia.Valor;
            lancamentoDebito.Historico = transferencia.Historico;
            lancamentoDebito.ContaBanco = transferencia.ContaBancoOrigem;
            lancamentoDebito.Transferencia = transferencia;

            Inserir(lancamentoDebito);

            Lancamento lancamentoCredito = new Lancamento();
            lancamentoCredito.DataEmissao = transferencia.DataOperacao;
            lancamentoCredito.EnumTipoLancamento = EnumTipoMovimentoFinanceiro.Receber;
            lancamentoCredito.Descricao = "Transferência Nº " + transferencia.TransferenciaId
                                         + " Débito na Conta " + transferencia.ContaBancoOrigem.Descricao + ": " + Util.NumeroContaFormatado(transferencia.ContaBancoOrigem.NumeroConta)
                                         + " e Crédito na Conta " + transferencia.ContaBancoDestino.Descricao + ": " + Util.NumeroContaFormatado(transferencia.ContaBancoDestino.NumeroConta)
                                         + " " + transferencia.Historico;
            lancamentoCredito.Documento = transferencia.Documento;
            lancamentoCredito.Valor = transferencia.Valor;
            lancamentoCredito.Historico = transferencia.Historico;
            lancamentoCredito.ContaBanco = transferencia.ContaBancoDestino;
            lancamentoCredito.Transferencia = transferencia;

            Inserir(lancamentoCredito);
        }

        public void CriarLancamento(Pagamento pagamento, EnumTipoMovimentoFinanceiro enumTipoMovimentoFinanceiro)
        {
            Lancamento lancamentoPagamento = new Lancamento();
            lancamentoPagamento.DataEmissao = pagamento.DataLancamentoPagamento.GetValueOrDefault();
            lancamentoPagamento.EnumTipoLancamento = enumTipoMovimentoFinanceiro;
            
            //Descrição
            if (lancamentoPagamento.EnumTipoLancamento == EnumTipoMovimentoFinanceiro.Pagar)
            {
                lancamentoPagamento.Descricao = "Pagamento Nº " + pagamento.PagamentoId;
               
                //Conta 
                if (pagamento.ContaBanco != null)
                {
                    lancamentoPagamento.Descricao  += " Débito na Conta " + pagamento.ContaBanco.Descricao + ": " +
                                                    Util.NumeroContaFormatado(pagamento.ContaBanco.NumeroConta);
                }

                //Forma Pagamento
                if (pagamento.FormaPagamento != null)
                {
                    lancamentoPagamento.Descricao += " pago em " + pagamento.FormaPagamento.Descricao;
                }
                                         
                                         
                lancamentoPagamento.Descricao  +=  " referente ao Título " + pagamento.Titulo.MovimentoId;
            }
            else
            {
                lancamentoPagamento.Descricao = "Pagamento Nº " + pagamento.PagamentoId;

                //Conta 
                if (pagamento.ContaBanco != null)
                {
                    lancamentoPagamento.Descricao += " Crédito na Conta " + pagamento.ContaBanco.Descricao + ": " +
                                                    Util.NumeroContaFormatado(pagamento.ContaBanco.NumeroConta);
                }

                //Forma Pagamento
                if (pagamento.FormaPagamento != null)
                {
                    lancamentoPagamento.Descricao += " pago em " + pagamento.FormaPagamento.Descricao;
                }


                lancamentoPagamento.Descricao += " referente ao Título " + pagamento.Titulo.MovimentoId;
            }

            //Se foi pagamento de Encontro de Contas coloca na Descrição
            if (pagamento.ContaBanco.TipoContaBanco.EnumTipoContaBanco == EnumTipoContaBanco.ContaAuxiliar)
            {
                lancamentoPagamento.Descricao += " (ENCONTRO DE CONTAS)";
            }

            lancamentoPagamento.Valor = pagamento.Valor;
            lancamentoPagamento.Cheque = pagamento.Cheque;
            lancamentoPagamento.ContaBanco = pagamento.ContaBanco;
            lancamentoPagamento.Pagamento = pagamento;

            Inserir(lancamentoPagamento);
        }

        public void CriarEstornoLancamento(Pagamento pagamento)
        {
            Lancamento lancamentoPagamento = new Lancamento();

            DateTime dataHoje = DateTime.Now.Date;
            
            //Se o Lançamento for Futuro Data do Lançamento Futuro Senão Data de Hoje
            if(pagamento.DataLancamentoPagamento.GetValueOrDefault().Date > dataHoje)
            {
                lancamentoPagamento.DataEmissao = pagamento.DataLancamentoPagamento.GetValueOrDefault();
            }
            else
            {
                lancamentoPagamento.DataEmissao = dataHoje;    
            }
            
            //Se A forma de Pagamento NÃO foi do Tipo Encontro de Contas Inverte o Tipo para o Lançamento
            if (pagamento.FormaPagamento.TipoFormaPagamento.EnumTipoFormaPagamento != EnumTipoFormaPagamento.EncontroContas)
            {
                lancamentoPagamento.EnumTipoLancamento = pagamento.Titulo.EnumTipoMovimentoFinanceiro == EnumTipoMovimentoFinanceiro.Pagar ? EnumTipoMovimentoFinanceiro.Receber : EnumTipoMovimentoFinanceiro.Pagar;
            }
            else
            {
                lancamentoPagamento.EnumTipoLancamento = pagamento.Titulo.EnumTipoMovimentoFinanceiro;
            }
            

            if (lancamentoPagamento.EnumTipoLancamento == EnumTipoMovimentoFinanceiro.Receber)
            {
                lancamentoPagamento.Descricao = "Estorno do Pagamento Nº " + pagamento.PagamentoId;

                //Conta 
                if (pagamento.ContaBanco != null)
                {
                    lancamentoPagamento.Descricao += " Débito na Conta " + pagamento.ContaBanco.Descricao + ": " +
                                                    pagamento.ContaBanco.NumeroConta;
                }

                //Forma Pagamento
                if (pagamento.FormaPagamento != null)
                {
                    lancamentoPagamento.Descricao += " pago em " + pagamento.FormaPagamento.Descricao;
                }


                lancamentoPagamento.Descricao += " referente ao Título " + pagamento.Titulo.MovimentoId;
            }
            else
            {
                lancamentoPagamento.Descricao = "Estorno do Pagamento Nº " + pagamento.PagamentoId;

                //Conta 
                if (pagamento.ContaBanco != null)
                {
                    lancamentoPagamento.Descricao += " Crédito na Conta " + pagamento.ContaBanco.Descricao + ": " +
                                                    pagamento.ContaBanco.NumeroConta;
                }

                //Forma Pagamento
                if (pagamento.FormaPagamento != null)
                {
                    lancamentoPagamento.Descricao += " pago em " + pagamento.FormaPagamento.Descricao;
                }


                lancamentoPagamento.Descricao += " referente ao Título " + pagamento.Titulo.MovimentoId;
            }

            lancamentoPagamento.Valor = pagamento.Valor;
            lancamentoPagamento.Cheque = pagamento.Cheque;
            lancamentoPagamento.ContaBanco = pagamento.ContaBanco;
            lancamentoPagamento.Pagamento = pagamento;

            Inserir(lancamentoPagamento);
        }
    }
}